package historical.cutting.board.util;

import org.jnativehook.GlobalScreen;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;

import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.KeyEvent;
import java.util.ArrayDeque;
import java.util.Queue;

public class ClipboardHistoryManager implements ClipboardOwner, NativeKeyListener {
    // 剪贴板历史队列（最多保留3条）
    private final Queue<String> clipboardHistory = new ArrayDeque<>(3);
    private final Clipboard systemClipboard;
    private Robot robot; // 用于模拟粘贴操作

    public ClipboardHistoryManager() throws AWTException {
        // 初始化系统剪贴板并注册监听器（监听内容变化）
        systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        systemClipboard.setContents(systemClipboard.getContents(null), this);

        // 初始化Robot（用于模拟按键）
        robot = new Robot();
    }

    // 监听剪贴板内容变化，更新历史记录
    @Override
    public void lostOwnership(Clipboard clipboard, Transferable contents) {
        try {
            // 延迟获取新内容（避免剪贴板未更新完成）
            Thread.sleep(100);
            Transferable newContents = clipboard.getContents(null);
            if (newContents != null && newContents.isDataFlavorSupported(DataFlavor.stringFlavor)) {
                String text = (String) newContents.getTransferData(DataFlavor.stringFlavor);
                // 避免重复内容入队
                if (!clipboardHistory.contains(text)) {
                    if (clipboardHistory.size() >= 3) {
                        clipboardHistory.poll(); // 移除最旧的一条
                    }
                    clipboardHistory.offer(text); // 添加新内容到队尾
                    System.out.println("剪贴板历史更新：" + clipboardHistory);
                }
            }
            // 重新注册监听器（因为失去所有权后需要重新监听）
            clipboard.setContents(clipboard.getContents(null), this);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 全局快捷键监听：处理Ctrl+1/2/3（并阻止其他应用响应）
    @Override
    public void nativeKeyPressed(NativeKeyEvent e) {
        // 判断是否按下Ctrl键
        boolean isCtrlDown = (e.getModifiers() & NativeKeyEvent.CTRL_MASK) != 0;
        if (!isCtrlDown) return;

        // 获取按下的数字键（1、2、3）
        int keyCode = e.getKeyCode();
        int index = -1;
        if (keyCode == NativeKeyEvent.VC_1) {
            index = 0;   // Ctrl+1：最近第1条
        } else if (keyCode == NativeKeyEvent.VC_2) {
            index = 1;   // Ctrl+2：最近第2条
        } else if (keyCode == NativeKeyEvent.VC_3) {
            index = 2;   // Ctrl+3：最近第3条
        }

        if (index != -1) {
            pasteHistory(index);
        }
    }

    // 粘贴指定索引的历史数据（0：最新，1：上一条，2：上两条）
    private void pasteHistory(int index) {
        if (index >= clipboardHistory.size()) {
            return;
        }

        // 将历史数据转为数组（方便按索引获取）
        String[] historyArray = clipboardHistory.toArray(new String[0]);
        String targetText = historyArray[historyArray.length - 1 - index]; // 倒序取（0是最新）

        try {
            // 1. 将目标文本写入剪贴板
            StringSelection selection = new StringSelection(targetText);
            systemClipboard.setContents(selection, this);

            // 2. 模拟Ctrl+V粘贴（延迟确保剪贴板已更新）
            robot.delay(50);
            robot.keyPress(KeyEvent.VK_CONTROL);
            robot.keyPress(KeyEvent.VK_V);
            robot.keyRelease(KeyEvent.VK_V);
            robot.keyRelease(KeyEvent.VK_CONTROL);

            System.out.println("已粘贴：" + targetText);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 以下方法为NativeKeyListener的空实现（必须重写）
    @Override
    public void nativeKeyReleased(NativeKeyEvent e) {}
    @Override
    public void nativeKeyTyped(NativeKeyEvent e) {}
    public void startListener() throws Exception {
        // 注册全局键盘事件监听器
        GlobalScreen.registerNativeHook();
        GlobalScreen.addNativeKeyListener(this);
    }

    // 程序退出时需注销监听器
    public void stopListener() throws Exception {
        GlobalScreen.unregisterNativeHook();
    }
}